/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sicadiredesg05;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Vista
 */
public class Conexao {

    private Socket socket;
    private DataInputStream recebe;
    private DataOutputStream envia;
    private BufferedReader bufferSocket;
    private String host;
    private int porta;

    public Conexao(int porta, String host){
        this.host = host;
        this.porta = porta;
    }

    public Conexao(Socket socket){
        this.socket = socket;
    }

    /**
     * Este metodo cria um socket cliente setando os parametros necessarios
     */
    public void inicial(){
        //se o socket aum foi passado na criacao da classe cria um novo!!
        if(socket == null){
            try {
                socket = new Socket(host, porta);
            } catch (UnknownHostException ex) {
                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        try {
            //inicia propriedade de leitura e gravacao no socket
            socket.setTcpNoDelay(true);
            recebe = new DataInputStream(socket.getInputStream());
            envia = new DataOutputStream(socket.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Este metodo escreve dados no socket
     * @param mensagem - dados a serem escritos
     */
    public void enviaDadosSocket(String mensagem){
        try {
            envia.write(mensagem.getBytes());
            envia.flush();
        } catch (IOException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Este metodo recebe dados do socket
     * @return - dados recebidos
     */
    public String recebeDadosSocket(){
        String mensagem = new String();
        bufferSocket = new BufferedReader(new InputStreamReader(recebe));
        try {
            mensagem = bufferSocket.readLine();
        } catch (IOException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return mensagem;
    }

    /**
     * Fecha os canais (iput e output) e a conexao
     */
    public void terminal(){
        try {
            recebe.close();
            envia.close();
            socket.close();
        } catch (IOException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * GETTERS AND SETTERS
     */
    public BufferedReader getBufferSocket() {
        return bufferSocket;
    }

    public void setBufferSocket(BufferedReader bufferSocket) {
        this.bufferSocket = bufferSocket;
    }

    public DataOutputStream getEnvia() {
        return envia;
    }

    public void setEnvia(DataOutputStream envia) {
        this.envia = envia;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPorta() {
        return porta;
    }

    public void setPorta(int porta) {
        this.porta = porta;
    }

    public DataInputStream getRecebe() {
        return recebe;
    }

    public void setRecebe(DataInputStream recebe) {
        this.recebe = recebe;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    
}
